package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.bean.User;
import com.itheima.common.R;
import com.itheima.service.UserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 获取验证码
     * @param map
     * @param session
     * @return
     */
    @PostMapping("/sendMsg")
    public R<Integer> sendMsg(@RequestBody Map<String,Object> map, HttpSession session){
        //1.获取要发送验证码的手机号
        String phone = map.get("phone").toString();

        //2.生成验证码
        Integer code = ValidateCodeUtils.generateValidateCode(4);
        log.info("生成验证码：{}",code);

        //3.将生成的验证码存入session 方便登录时和用户输入的验证码进行比对
        session.setAttribute("code",code);

        //4.调用工具类向该手机号发送验证码
        //SMSUtils.sendMessage("瑞吉外卖","瑞吉外卖",phone,code.toString());

        //5.响应处理结果【方便开发测试 实际开发中不这样搞】
        return R.success(code);
    }

    /**
     * 用户登录
     * @param map
     * @param session
     * @return
     */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map<String,Object> map, HttpSession session){
        //1.调用service处理
        //1.1：从map集合中获取用户输入的手机号和验证码
        String phone = map.get("phone").toString();
        String code = map.get("code").toString();   //用户输入的验证码

        //1.2：获取session中保存的验证码
        String validateCode = session.getAttribute("code").toString();

        //1.3：判断用户输入的验证码和后台生成的验证码是否一致
        if(validateCode==null || !validateCode.equals(code)){
            //1.4：如果不一致，响应"验证码输入有误"
            return R.error("验证码输入有误");
        }

        //1.5: 一致：判断当前手机号是不是新手机号，如果不是需要保存到数据库user表中，返回"登录成功"
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getPhone,phone);
        User user = userService.getOne(wrapper);
        if(user==null){
            user = new User();      //由于是新用户 不存在 需要创建user对象
            user.setPhone(phone);   //设置新用户的手机号
            user.setStatus(1);      //设置新用户状态启用
            userService.save(user); //将新用户记录保存到数据库user表中
        }

        //1.6:登录成功之后 将 用户id保存到session中
        session.setAttribute("user",user.getId());

        //2.响应处理结果
        return R.success(user);
    }


    /**
     * 退出登录
     * @param session
     * @return
     */
    @PostMapping("/loginout")
    public R<String> loginOut(HttpSession session){
        //1.清空session中用户id
        session.invalidate();

        //2.响应退出登录成功即可
        return R.success("退出登录成功！");
    }


}
